<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
  </head>
  <body>
    <script type="text/javascript">
      /**
       * 对于这题我们采用了两种方法，
       * 一种是使用循环，另一种是使用递归
       * 循环的比较好理解，这里我们只讲讲递归的思路
       * 因为递归到末尾需要用到前两项的值，这里我们就将它写进递归，不单独判断这个条件了
       * 我们这个递归是用于判断是否是斐波那契数列，
       * 递归终止条件是下标为1，因为前两项的判断方法和后面的项不一样
       * 对于index=1自然就是返回前两项是否为0、1,
       * 其他情况需要注意，它取决于两个条件，一个是上一个函数的返回值，另一个是当前项是否符合斐波那契数列
       * 并且是只要有false则为false，所以这里我们需要使用&&
       */
      const _isFibonacci = (array) => {
        // 补全代码
        try {
          if (array.length < 3) {
            throw new Error("数组长度不能小于3");
          }

          if (array[0] != 0 || array[1] != 1) {
            throw new Error("数组前两个元素不是0和1");
          }

          for (let i = 2; i < array.length; i++) {
            if (array[i] != array[i - 1] + array[i - 2]) return false;
          }

          return true;
        } catch (e) {
          console.log(e);
          return false;
        }
      };
      let array = [0, 1, 1];
      console.log(_isFibonacci(array));

      //使用递归实现斐波那契数列的判断
      const _isFibonacci1 = (array) => {
        try {
          if (array.length < 3) {
            throw new Error("数组长度不能小于3");
          }

          return recursivelyJudgeFibonacciSequence(array, array.length - 1);
        } catch (err) {
          console.log(err);
          return false;
        }
      };

      const recursivelyJudgeFibonacciSequence = (array, index) => {
        if (index == 1) return array[0] == 0 && array[1] == 1;
        else
          recursivelyJudgeFibonacciSequence(array, index - 1) &&
            array[index] == array[index - 1] + array[index - 2];
      };
      console.log(_isFibonacci1([0, 1, 1]));
    </script>
  </body>
</html>
